package net.oschina.android.ui.fragment;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Fragment;
import android.os.AsyncTask;

/**
 * 处理APP启动时，初始化各种数据的Fragment
 * 这个Fragment没有任何界面，用来加载数据。
 * @author HuangWenwei
 *
 * @date 2014年8月26日
 */
@SuppressLint("NewApi")
public class DataLoaderFragment extends Fragment {
	
	/**
	 *接受加载数据进度的通知
	 * @date 2014年8月26日
	 */
	public interface ProgressListener{
		/**
		 * 任务完成通知
		 *2014年8月26日
		 *@param result
		 */
		public void onCompletion(Double result);
		/**
		 * 进度通知
		 *2014年8月26日
		 *@param value
		 */
		public void onProgressUpdate(int value);
	}
	
	private ProgressListener mProgressListener;
	private Double mResult = Double.NaN;
	private LoadingTask mTask;
	
	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		//宿主Activity被重新创建之后，该Fragment会继续存在
		setRetainInstance(true);
	}
	
	public Double getResult(){
		return mResult;
	}
	
	public boolean hasResult(){
		return !Double.isNaN(mResult);
	}
	
	public void removeProgressListener(){
		mProgressListener = null;
	}

	public void setProgressListener(ProgressListener listener){
		mProgressListener = listener;
	}

	public void startLoading(){
		mTask = new LoadingTask();
		mTask.execute();
	}

	/**
	 * 异步加载数据类
	 * @date 2014年8月26日
	 */
	public class LoadingTask extends AsyncTask<Void, Integer, Double> {

		@Override
		protected Double doInBackground(Void... params) {
			Double result = (double) 0;
			for(int i = 0; i<100; i++){
				try {
					result += Math.sqrt(i);
					Thread.sleep(50);
					//调用publicProgress方法以传递参数值给onProgressUpdate处理程序
					//当后台任务完成之后，可以返回最终结果并作为参数传递给onPostExecute处理程序
					this.publishProgress(i);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			//返回一个值，它将传递给onPostExecute
			return Double.valueOf(result);
		}

		/*
		 * 当doInBackground完成后，该方法的返回值就会传入到这个事件处理程序
		 * 当异步任务完成后，使用这个处理程序更新UI
		 */
		@Override
		protected void onPostExecute(Double result) {
			mResult = result;
			mTask = null;
			if(mProgressListener!=null)
				mProgressListener.onCompletion(mResult);
		}

		/*
		 * 重写这个处理程序，当中间进度更新时更新UI。
		 * 这个处理程序接受一组从doInBackground处理程序内传递的publicProgress的参数
		 */
		@Override
		protected void onProgressUpdate(Integer... values) {
			if(mProgressListener != null)
				mProgressListener.onProgressUpdate(values[0]);
		}
	}
}
